/**
 * @file        MPU6050.c
 * @author      JinChengLong (https://gitee.com/Datejin/)
 * @brief       mpu6050库函数
 * @version     0.1
 * @date        2023
 * 
 * @copyright   Copyright © 2025 by JinChengLong 
 * 
 * All rights reserved.
 * Unauthorized copying, reproduction, or redistribution of this file via any medium is strictly prohibited.  
 * Proprietary and confidential.
 *   
 */



#include "MPU6050.h"


#define MPU6050_ADDRESS   0XD0			//反复使用该参量，方便修改//从机地址
#define SCL_PIN  	GPIO_Pin_10



/**
 * @brief 对mpu6050通过i2c读指定寄存器寄存器
 * 
 * @param Raddress 指定写的地址寄存器
 * @param Data 		写入的数据
 */
void MPU6050_writeR(uint8_t Raddress,uint8_t Data)////8位的寄存器地址//8位的数据
{
	I2CA_start();//起始条件
	I2CA_sendbyte(MPU6050_ADDRESS);//从机地址加读写位
	I2CA_receiveACK();	//应答位//可判断从机有无收到数据
	I2CA_sendbyte(Raddress);//指定寄存器地址
	I2CA_receiveACK();
	//
	I2CA_sendbyte(Data);//写入数据
	I2CA_receiveACK();
	//
	I2CA_stop();//终止条件
}


/**
 * @brief mpu6050通过i2c写指定寄存器
 * 
 * @param Raddress 读指定地址
 * @return uint8_t 读取到的数据
 */
uint8_t MPU6050_readR(uint8_t Raddress)//指定地址读
{
	uint8_t data;
	I2CA_start();//起始条件
	I2CA_sendbyte(MPU6050_ADDRESS);//从机地址加读写位
	I2CA_receiveACK();	//应答位//可判断从机有无收到数据
	I2CA_sendbyte(Raddress);//指定寄存器地址//设置好当前指针
	I2CA_receiveACK();
	
	//转入读，重新指定读写位
	I2CA_start();//重复起始条件
	I2CA_sendbyte(MPU6050_ADDRESS|0XD1);//从机地址加读写位为读从机
	I2CA_receiveACK();	//应答位//可判断从机有无收到数据
	
	//读数据
	data=I2CA_receivebyte();
	I2CA_sendACK(1);//给从机应答//应答后继续发送数据//给1停止发送
	I2CA_stop();//终止条件
	//
	
	return data;
	
}



/**
 * @brief 初始化mpu6050
 * 
 */
void MPU6050_init(void)
{
	I2CA_init();
	
	//写入一些寄存器对MPU6050硬件电路进行初始化配置
	MPU6050_writeR(MPU6050_PWR_MGMT_1,0x01);//配置电源管理寄存器//解除睡眠模式//选择陀螺仪x轴的时钟
	MPU6050_writeR(MPU6050_PWR_MGMT_2,0x00);//没有换电频率//每轴不许待机
	MPU6050_writeR(MPU6050_SMPLRT_DIV,0x09);//采样率分频//10分频
	MPU6050_writeR(MPU6050_CONFIG,0x06);//配置寄存器//不需要外部同步//平滑滤波
	MPU6050_writeR(MPU6050_GYRO_CONFIG,0x18);//陀螺仪配置寄存器//自测使能不自测//满量程选择11最大量程
	MPU6050_writeR(MPU6050_ACCEL_CONFIG,0x18);//加速度计配置寄存器//自测使能不自测//满量程选择11最大量程//不用高通滤波器
	
}


//返回6个int16_t的数据//xyz的加速的置和陀螺仪值
//init16_t的指针类型
//主函数定义变量通过指针把主函数变量的地址传递到子函数中
//子函数中，通过传递过来的地址，操作主函数的变量
/**
 * @brief 获取陀螺仪和加速度计的数据
 * 
 * @param ACCX x轴加速度
 * @param ACCY y轴加速度
 * @param ACCZ z轴加速度
 * @param GYROX x轴陀螺仪
 * @param GYROY y轴陀螺仪
 * @param GYROZ z轴陀螺仪
 */
void MPU6050_getdata(int16_t*ACCX,int16_t*ACCY,int16_t*ACCZ,int16_t*GYROX,int16_t*GYROY,int16_t*GYROZ)
{
	uint8_t datah,datal;
	datah=MPU6050_readR(MPU6050_ACCEL_XOUT_H);	//加速度轴寄存器
	datal=MPU6050_readR(MPU6050_ACCEL_XOUT_L);
	*ACCX=(datah<<8)|datal;						//加速度x轴的16位数据（自动类型转换，不会丢失）//通过指针返回回去
	
	

    datah=MPU6050_readR(MPU6050_ACCEL_YOUT_H);	//Y轴
    datal=MPU6050_readR(MPU6050_ACCEL_YOUT_L);
    *ACCY=(datah<<8)|datal;						
	
	

    datah=MPU6050_readR(MPU6050_ACCEL_ZOUT_H);	//Z轴
    datal=MPU6050_readR(MPU6050_ACCEL_ZOUT_L);
    *ACCZ=(datah<<8)|datal;						

	
    datah=MPU6050_readR(MPU6050_GYRO_XOUT_H);	//陀螺仪X轴
    datal=MPU6050_readR(MPU6050_GYRO_XOUT_L);
    *GYROX=(datah<<8)|datal;						

    datah=MPU6050_readR(MPU6050_GYRO_YOUT_H);	//陀螺仪Y轴
    datal=MPU6050_readR(MPU6050_GYRO_YOUT_L);
    *GYROY=(datah<<8)|datal;	
	
	datah=MPU6050_readR(MPU6050_GYRO_ZOUT_H);	//陀螺仪Z轴
    datal=MPU6050_readR(MPU6050_GYRO_ZOUT_L);
    *GYROZ=(datah<<8)|datal;	

}














